home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / tools / disk-tools / harddisk / rdbmount_1_2 / rdbmount.c~ < prev    next >
Text File  |  1994-08-16  |  7KB  |  223 lines

  1. /*
  2.  *    Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created: 28 Mar 1993
  5.  *    Modified:    20 May 1993    11:43:01
  6.  *
  7.  * Make>> SC <file>.c
  8.  * Make>> SLink Lib:Entry.o <file>.o LIB Lib:String.lib MAP <file>.map F,H,L,O,S,X NOICON VERBOSE SmallCode SmallData BATCH
  9.  * Ma ke>> SLink Lib:Entry.o <file>.o LIB Lib:Startup.lib Lib:String.lib MAP <file>.map F,H,L,O,S,X NOICON VERBOSE SmallCode SmallData BATCH
  10.  */
  11.  
  12. #include <Main.h>
  13. #include <StringLib.h>
  14.  
  15. #include <Libraries/HardBlocks.h>
  16. /*#include <pragmas/HardBlocks_pragmas.h>*/
  17.  
  18. #define MAXSTRINGLEN 255/2
  19. #define MAXNUMARGS 64
  20. #define MAXDEFAULTLEN 512/2
  21.  
  22. STRPTR Template = "DosDev/M/A,ExecDev,UnitNr/N";
  23. #define ARG_DosDevA    0
  24. #define ARG_ExecDev    1
  25. #define ARG_UnitNr    2
  26. #define ARG_ENDARG    3
  27. STRPTR CliHelp = "RDBMount V1.0 © 1993 S.R.\n\
  28. Usage: RDBMount <DosDevName> [ExecDevName] [ExecUnitNr]\n\
  29. Default: ExecDevName = scsi.device ExecUnitNr = 0 or read Env \"RDBMount.DefOpts\"\n\
  30. Use to mount DOS Dev from the RigidDiskBlock information stored on (HD) drive\n";
  31.  
  32. struct DosLibrary *DOSBase;
  33. struct Library *UtilityBase;
  34. struct Library *ExpansionBase;
  35. struct Library *HardBlocksBase;
  36.  
  37. char *B2CStr( UBYTE *BStr, char Buff[]) 
  38. {
  39.     UBYTE i;
  40.  
  41.     for ( i = 0; i < *BStr; i++)
  42.         {
  43.             Buff[ i] = (BStr + 1)[ i];
  44.         }
  45.     Buff[ i] = '\0';
  46.  
  47.     return Buff;
  48. }
  49.  
  50. BOOL IsMounted( char DosName[])
  51. {
  52.     struct DosList *DList;
  53.     BOOL Found = FALSE;
  54.  
  55.     DList = LockDosList( LDF_DEVICES|LDF_READ);
  56.     Found = (BOOL) FindDosEntry( DList, DosName, LDF_DEVICES);
  57.     UnLockDosList( LDF_DEVICES|LDF_READ);
  58.  
  59.     return Found;
  60. }
  61.  
  62. ULONG __asm Main(register __a0 APTR ArgV[], register __a1 struct WBStartup * WBenchMsg);
  63. ULONG __asm __Main(register __d2 ULONG CmdLen, register __a2 STRPTR CmdPtr)
  64. {
  65.     struct Process *pp;
  66.     ULONG RC = 1001;        /* assumle the worst */
  67.  
  68.     pp = (struct Process *) FindTask(0L);
  69.  
  70.     if (DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 34L))
  71.         {
  72.             if (DOSBase->dl_lib.lib_Version > 36)
  73.                 {
  74.                     APTR ArgV[MAXNUMARGS];
  75.                     struct RDArgs *RA;
  76.                     struct RDArgs *DefaultRDArgs;
  77.  
  78.                     UtilityBase = DOSBase->dl_UtilityBase;
  79.                     if (RA = AllocDosObject(DOS_RDARGS, NULL))
  80.                         {
  81.                             memset(ArgV, 0, MAXNUMARGS * sizeof(APTR));
  82.                             RA->RDA_ExtHelp = CliHelp;
  83.                             /* first read default */
  84.                             /* getting the default string */
  85.                             if (DefaultRDArgs = AllocDosObject(DOS_RDARGS, NULL))
  86.                                 {
  87.                                     UBYTE Default[ MAXDEFAULTLEN] = "DosDev Dummy ExecDev scsi.device UnitNr 0";
  88.  
  89.                                     if ( (DefaultRDArgs->RDA_Source.CS_Length = GetVar("RDBMount.DefOpts", Default, MAXDEFAULTLEN - 1, 0L)) > 0)
  90.                                         ;
  91.                                     else
  92.                                         DefaultRDArgs->RDA_Source.CS_Length = strlen( Default);
  93.                                     {
  94.                                         /* let ReadArgs() allocate neccesary buffer sinc I use diferrent RDArgs for Default and CLI opts */
  95.  
  96.                                         /* Ok I succefuly read a Default Option string now parse it */
  97.                                         Default[DefaultRDArgs->RDA_Source.CS_Length++] = '\n';    /* this is need by ReadArgs() */
  98.                                         Default[DefaultRDArgs->RDA_Source.CS_Length] = '\0';    /* this is need by ReadArgs() */
  99.                                         DefaultRDArgs->RDA_Source.CS_Buffer = Default;
  100.                                         DefaultRDArgs->RDA_Source.CS_CurChr = 0;
  101.                                         DefaultRDArgs->RDA_Flags = RDAF_NOPROMPT;
  102.                                         if (!ReadArgs(Template, (long *) ArgV, DefaultRDArgs))
  103.                                             {
  104.                                                 PutStr("Error in Default:");
  105.                                                 PrintFault(IoErr(), NULL);
  106.                                                 memset(ArgV, 0, MAXNUMARGS * sizeof(APTR));
  107.                                             }
  108.                                         DefaultRDArgs->RDA_Source.CS_Buffer = NULL;    /* Now ReadArgs() from Command line */
  109.                                         /* the ArgV is leaving unchanged: the second ReadArgs() take actual value as default */
  110.                                     }
  111.                                 }
  112.                             /* Let ReadArgs() allocate necessay buffer rather using stack space */
  113.                             if (ReadArgs(Template, (long *) ArgV, RA))
  114.                                 {
  115.                                     RC = Main(ArgV, NULL);
  116.                                 }
  117.                             else
  118.                                 {
  119.                                     PrintFault(IoErr(), NULL);
  120.                                     RC = 20;
  121.                                 }
  122.                             FreeDosObject(DOS_RDARGS, RA);
  123.                             /* Free RDargs now I don't need the option value */
  124.                             if (DefaultRDArgs)
  125.                                 FreeDosObject(DOS_RDARGS, DefaultRDArgs);
  126.                         }
  127.                 }
  128.             else
  129.                 {
  130.                     Write(pp->pr_COS, "You need KickStart 2.0+\n", 24L);
  131.                     RC = 1000;
  132.                 }
  133.             CloseLibrary((struct Library *) DOSBase);
  134.         }
  135.  
  136.     return RC;
  137. }
  138.  
  139. ULONG __asm Main( register __a0 APTR ArgV[], register __a1 struct WBStartup *WBenchMsg)
  140. {
  141.     ULONG RC = 20;    /* default :Don't find desired Partition */
  142.  
  143.     ExpansionBase = OpenLibrary( "expansion.library", 37L);
  144.  
  145.     if ( HardBlocksBase = OpenLibrary(HardBlocksName, HardBlocksVersion))
  146.         {
  147.             struct RigidDiskBlock rdb;
  148.  
  149.             if ( !(RC = LoadHardBlocks( &rdb, ArgV[ ARG_ExecDev], *(( ULONG *)ArgV[ ARG_UnitNr]))))
  150.                 {
  151.                     #define MAXMOUNT 10
  152.                     ULONG parmPkt[ MAXMOUNT][ 21 + 10];    /* WARN: this is a lenthg which can change */
  153.                     char DevNames[ MAXMOUNT][ 20];    /* mem string don't be lost until the mount */
  154.                     UBYTE MountCnt = 0;
  155.                     UBYTE i, j;
  156.                     char *Str;
  157.  
  158.                     for ( i = 0, Str = ( (char **)ArgV[ ARG_DosDevA])[ 0]; Str && ( i < MAXMOUNT); i++, Str = ( (char **)ArgV[ ARG_DosDevA])[ i])
  159.                         {
  160.                             BOOL Found = FALSE;
  161.                             struct PartitionBlock *PB;
  162.                             char Buff[ MAXSTRINGLEN];
  163.                             char DosDevName[ MAXSTRINGLEN];
  164.  
  165.                             strcpy( DosDevName, Str);
  166.                             {
  167.                                 UBYTE l;
  168.                                 if ( DosDevName[ l = (strlen( DosDevName) - 1)] == ':')
  169.                                     DosDevName[ l] = '\0';
  170.                             }
  171.                             if ( !IsMounted( DosDevName))
  172.                                 {
  173.                                     for ( PB = (struct PartitionBlock *) rdb.rdb_PartitionList; PB && !Found; PB = (struct PartitionBlock *)PB->pb_Next)
  174.                                         {
  175.                                             B2CStr( PB->pb_DriveName, Buff);
  176.                 //                            Printf( "Dos Name:\"%s\"\n", Buff);
  177.                 //                            Printf("pb:%lx, next:%lx\n", PB, PB->pb_Next);
  178.                                             if ( !Strnicmp( DosDevName, Buff, MAXSTRINGLEN))
  179.                                                 {
  180.                                                     strcpy( DevNames[ MountCnt], Buff);
  181.                                                     parmPkt[ MountCnt][ 0] = (ULONG)DevNames[ MountCnt];
  182.                                                     parmPkt[ MountCnt][ 1] = (ULONG)ArgV[ ARG_ExecDev];
  183.                                                     parmPkt[ MountCnt][ 2] = *( (ULONG *)ArgV[ ARG_UnitNr]);    /* unit number */
  184.                                                     parmPkt[ MountCnt][ 3] = 0;    /* OpenDevice flags */
  185.                                                     CopyMem( PB->pb_Environment, &parmPkt[ MountCnt][ 4], sizeof( PB->pb_Environment));
  186.                                                     Found = TRUE;
  187.                                                     MountCnt++;
  188.                                                 }
  189.                                         }
  190.                                     if ( !Found)
  191.                                         Printf( "\"%s:\" not found.\n", DosDevName);
  192.                                 }
  193.                             else
  194.                                 {
  195.                                     Printf( "\"%s:\" alredy mounted.\n", DosDevName);
  196.                                 }
  197.                         }
  198.                     for ( j = 0; j < MountCnt; j++)
  199.                         {
  200.                             struct DeviceNode *DeviceNode;
  201.  
  202.                             if ( DeviceNode = MakeDosNode( parmPkt[ j]))
  203.                                 {
  204.                                     if ( !AddDosNode( -128, ADNF_STARTPROC, DeviceNode))
  205.                                         {
  206.                                             Printf( "\"%s\" can't be Mounted\n", parmPkt[ j][ 0]);
  207.                                         }
  208.                                 }
  209.                         }
  210.                     FreeHardBlocks(&rdb);
  211.                 }
  212.             else
  213.                 Printf( "Unable to Load RDB from \"%s\" %ld\n", ArgV[ ARG_ExecDev], *( (ULONG *)ArgV[ ARG_UnitNr]));
  214.             CloseLibrary(HardBlocksBase);
  215.         }
  216.     else
  217.         Printf( "Unable to open hardblocks.library V1+\n");
  218.  
  219.     CloseLibrary( ExpansionBase);
  220.  
  221.     return RC;
  222. }
  223.